package com.tools.service.workflow;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tools.pojo.workflow.po.StepExecution;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface StepExecutionService extends IService<StepExecution> {

    /**
     * 创建步骤执行记录
     * @param flowInstanceId 流程实例ID
     * @param flowConfig 流程配置
     * @return 步骤执行记录列表
     */
    List<StepExecution> createStepExecutions(Long flowInstanceId, String flowConfig);

     /**
     * 获取待执行的步骤
     * @param flowInstanceId 流程实例ID
     * @return 待执行的步骤列表
     */
    List<StepExecution> getPendingSteps(Long flowInstanceId);

     /**
     * 根据流程实例ID获取所有步骤执行记录
     * @param flowInstanceId 流程实例ID
     * @return 步骤执行记录列表
     */
    List<StepExecution> getByFlowInstanceId(Long flowInstanceId);

     /**
     * 更新步骤执行状态
     * @param stepExecutionId 步骤执行记录ID
     * @param status 执行状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    void updateStepStatus(Long stepExecutionId, Integer status, LocalDateTime startTime, LocalDateTime endTime);

     /**
     * 更新步骤执行成功状态
     * @param stepExecutionId 步骤执行记录ID
     * @param outputData 输出数据
     * @param message 执行消息
     */
    void updateStepSuccess(Long stepExecutionId, Object outputData, String message);

    /**
     * 更新步骤执行失败状态
     * @param stepExecutionId 步骤执行记录ID
     * @param errorMessage 错误消息
     * @param shouldCompensate 是否需要补偿
     */
    void updateStepFailure(Long stepExecutionId, String errorMessage, boolean shouldCompensate);


     /**
     * 解析步骤配置
     * @param stepExecution 步骤执行记录
     * @return 解析后的步骤配置
     */
    Map<String, Object> parseStepConfig(StepExecution stepExecution);

     /**
     * 获取失败的步骤
     * @param flowInstanceId 流程实例ID
     * @return 失败的步骤列表
     */
    List<StepExecution> getFailedSteps(Long flowInstanceId);

     /**
     * 根据流程实例和步骤编码获取步骤执行记录
     * @param flowInstanceId 流程实例ID
     * @param stepCode 步骤编码
     * @return 步骤执行记录
     */
    StepExecution getByFlowInstanceAndStepCode(Long flowInstanceId, String stepCode);
}
